import json
import re


def construct_prompt(d):
    """
    构造用于大语言模型的提示词

    参数:
    d (dict): jsonl数据文件的一行，为字典类型的变量，详细的数据格式见val.jsonl的说明

    返回:
    list: OpenAI API的message格式列表，允许设计多轮对话式的prompt
    示例: [{"role": "system", "content": "系统提示内容"},
           {"role": "user", "content": "用户提示内容"}]
    """

    观影表 = d['item_list']
    行表 = []
    行表 .append('''
你是一个电影推荐专家，能根据用户的观影历史，推测用户接下来最可能看哪些电影。
用户已看过这些电影（按时间升序排列）：
| 片名 |
|:----------|
''')
    for 电影编号, 片名 in 观影表:
        行表.append(f'|{片名}|\n')

    行表.append('''这里有一些候选的电影:
| 电影编号 | 片名 |
|--------:|:----------|
''')
    for 电影编号, 片名 in d['candidates']:
        行表.append(f'|{电影编号}|{片名}|\n')

    行表.append('''\n你尝试把这些候选电影按用户接下来观看的概率降序排列，输出排列好的电影编号列表，类似这种格式：[5731,111,359] . 
你可以按以下步骤一步一步来处理：
- 列出用户已看电影和候选电影的片名、导演、编剧、主演、类型、风格、年代等。
- 尝试找到用户观影历史的多个规律，比如是否有相同的导演、编剧、主演、类型、风格、年代，或尝试推测下用户的情境。
- 给每部候选电影按符合观影历史规律的程度打分。
- 按候选电影得分排名,得分高的排前面。
- 仔细比较得分相近的2部候选电影，微调它们的推荐顺名。
- 按要求的格式，按推荐程度降序排列，注意只输出电影编号。
''')

    return [{"role": "user", "content": ''.join(行表)}]


def parse_output(text):
    """
    解析大语言模型的输出文本，提取推荐重排列表

    参数:
    text (str): 大语言模型在设计prompt下的输出文本

    返回:
    list: 从输出文本解析出的电影ID列表（python列表格式，列表的每个元素是整数，表示编号），表示重排后的推荐顺序
    示例: [1893, 3148, 111, ...]
    """
    numbers = []
    match = None
    for match in re.finditer(r'\[\s*\d+\s*(,\s*\d+\s*)*\]', text):
        pass
    if match:
        numbers = json.loads(match.group(0))
        print(numbers)
    else:
        print('没有找到合格的输出')

    return numbers
